package warenautomat;

import java.text.SimpleDateFormat;

import warenautomat.SystemSoftware;

public class Drehteller {
   private static final int ANZAHL_FAECHER = 16;
   private Fach mFaecher[];
   private int mAktuellesFach;
   private Automat mAutomat;
   private int mDrehtellerNr;
   

   private SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");

   /* 
    * Konstruktor
    * 
    * @param pAutomat         Verknüpfung zum dazugehürigen Automat
    * @param pDrehtellerNr    Drehtellernummer im Automat. Nummerierung beginnt mit 1 (nicht 0)!
    */
   public Drehteller(Automat pAutomat, int pDrehtellerNr) {
      mFaecher = new Fach[ANZAHL_FAECHER];
      for (int i = 0; i < ANZAHL_FAECHER; i++) {
         mFaecher[i] = new Fach();
      }
      mAutomat = pAutomat;
      mDrehtellerNr = pDrehtellerNr;
      System.out.println("Drehteller::Drehteller(pAutomat, "+ pDrehtellerNr +"): ");
   }

   /*
    * dreht den Teller und aktualisiert Anzeigen
    * 
    * @param pDrehtellerNr Die Drehtellernummer dieses Tellers. Diese wird vom
    * Automat vergeben.<br> Nummerierung beginnt mit 1 (nicht 0)!
    */
   public void drehen() {
      mAktuellesFach++;
      if (mAktuellesFach >= ANZAHL_FAECHER) {
         mAktuellesFach = 0;
      }

      Ware fachInhalt = mFaecher[mAktuellesFach].getWare();
      double preisInFranken = 0.0;
      int zustand = getZustandWare(fachInhalt);

      if (fachInhalt != null) {
         preisInFranken = fachInhalt.getPreisInRappen() / 100.0;
      }

      SystemSoftware.zeigeWarenPreisAn(mDrehtellerNr, preisInFranken);
      SystemSoftware.zeigeVerfallsDatum(mDrehtellerNr, zustand);
      System.out.println("Drehteller::drehen():");
   }

   /*
    * üffnet das Fach. Im Hintergrund werden überprüfungen durchgeführt.
    * überprüft wird:
    * - ist genug Geld vorhanden?
    * - ist Wechselgeld vorhanden?
    * - ist Fachinhalt abgelaufen?
    * 
    * @return null bei Fehler, sonst Ware
    */
   public Ware oeffnen() {
      Ware verkaufteWare = null;
      Ware fachInhalt = mFaecher[mAktuellesFach].getWare();

      if (fachInhalt != null && mAutomat != null) {
         Kasse kasse = mAutomat.gibKasse();
         if(kasse.istGenugGeldVorhanden(fachInhalt.getPreisInRappen()) == true){
            if(kasse.istWechselgeldVorhanden(fachInhalt.getPreisInRappen()) == true){
               if(fachInhalt.getIstAbgelaufen() == false){
                  // Ware kann verkauft werden
                  fachInhalt.setVerkaufsdatum(SystemSoftware.gibAktuellesDatum());
                  verkaufteWare = fachInhalt;
                  leereFach();
               }
            }
         }
      }

      System.out.println("Drehteller::oeffnen(): " + (verkaufteWare != null ? "erfolgreich" : "fehlerhaft"));
      return verkaufteWare;
   }

   
   /*
    * Füllt den Inhalt des Fachs mit Ware.
    * 
    */
   public void fuelleFach(Ware pWare) {
      mFaecher[mAktuellesFach].fuelleFach(pWare);

      SystemSoftware.zeigeWarenPreisAn(mDrehtellerNr, pWare.getPreisInRappen()/100.0);
      SystemSoftware.zeigeVerfallsDatum(mDrehtellerNr, getZustandWare(pWare));
      SystemSoftware.zeigeWareInGui(mDrehtellerNr, pWare.getName(), pWare.getAblaufDatum());
      System.out.println("Drehteller::fuelleFach("+ pWare.getName() +","+ pWare.getPreisInRappen() +"Rp., "+ formatter.format(pWare.getAblaufDatum()) +"): ");
   }

   /*
    * Leert den Inhalt des Fachs.
    * 
    */
   private void leereFach() {
      mFaecher[mAktuellesFach].leereFach();
      
      SystemSoftware.zeigeWarenPreisAn(mDrehtellerNr, 0.0);
      SystemSoftware.zeigeVerfallsDatum(mDrehtellerNr, 0);
      SystemSoftware.zeigeWareInGui(mDrehtellerNr, null, null);
      System.out.println("Drehteller::leereFach()");
   }

   /*
    * Gibt den Zustand über das Verfallsdatum der Ware zurück.
    * 
    * @return 0 = keine Ware vorhanden, 1 = Ware ok, 2 = Ware abgelaufen
    */
   private int getZustandWare(Ware pWare) {
      int zustand = 0; // 0 = keine Ware vorhanden

      if (pWare != null) {
         zustand = 1; // 1 = Ware nicht abgelaufen
         if (pWare.getIstAbgelaufen() == true) {
            zustand = 2; // 2 = Ware abgelaufen
         }
      }

      System.out.println("Drehteller::getZustandWare(pWare): " + zustand);
      return zustand;
   }

}
